﻿Imports Microsoft.Practices.EnterpriseLibrary.Data
Imports Microsoft.Practices.EnterpriseLibrary.Common
Imports Microsoft.Practices.EnterpriseLibrary.Data.Sql
Imports System.Data
Imports System.Data.SqlClient

''' <summary>
''' Class xử lý các thao tác truy cập đến cơ sở dữ liệu
''' </summary>
''' <remarks>Nguyễn Huy Thường added on 10/04/2011</remarks>
Public Class clsDLBase

    ''' <summary>
    ''' Biến lưu đối tượng tương tác với database
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 10/04/2011</remarks>
    Private ReadOnly db As SqlDatabase

#Region "Method"

#Region "Constructor"

    ''' <summary>
    ''' Constructor tạo mới connection đến database
    ''' </summary>
    ''' <param name="connectionString">Chuỗi chứa kết nối đến database</param>
    ''' <remarks>Nguyễn Huy Thường added on 10/04/2011</remarks>
    Public Sub New(ByVal connectionString As String)
        db = New SqlDatabase(connectionString)
    End Sub
#End Region

    ''' <summary>
    ''' Sub thực hiện việc kiểm tra tên đăng nhập và mật khẩu để đăng nhập vào hệ thống
    ''' </summary>
    ''' <param name="loginName">Tên đăng nhập</param>
    ''' <param name="password">mật khẩu</param>
    ''' <returns>Trả lại true nếu tên đăng nhập và mật khẩu hợp lệ và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 09/07/2012</remarks>
    Public Function CheckUser(ByVal loginName As String, ByVal password As String) As String
        Return db.ExecuteScalar(My.Resources.LoginSP, loginName, password)
    End Function

    ''' <summary>
    ''' Sub lấy toàn bộ dữ liệu hiện có trong một bảng từ database
    ''' </summary>
    ''' <param name="ds">Dataset để chứa dữ liệu sau khi lấy từ database</param>
    ''' <param name="tableName">Tên của bảng đang làm việc hiện thời</param>
    ''' <remarks>Nguyễn Huy Thường added on 10/04/2011</remarks>
    Public Sub GetData(ByVal ds As DataSet, ByVal tableName As String)
        db.LoadDataSet(String.Format(My.Resources.SelectAllSP, tableName), ds, New String() {tableName})
    End Sub

    ''' <summary>
    ''' Sub lấy dữ liệu từ database theo khóa ngoại
    ''' </summary>
    ''' <param name="ds">Dataset để chứa dữ liệu sau khi lấy từ database</param>
    ''' <param name="tableName">Tên của bảng cần lấy dữ liệu</param>
    ''' <param name="columnName">Tên của cột cần chọn lọc</param>
    ''' <param name="value">Giá trị cần để chọn lọc dữ liệu</param>
    ''' <remarks>Nguyễn Huy Thường added on 10/04/2011</remarks>
    Public Sub GetDataByValue(ByVal ds As DataSet, ByVal tableName As String, ByVal columnName As String, ByVal value As Object)
        db.LoadDataSet(String.Format(My.Resources.SelectByValueSP, tableName, columnName), ds, New String() {tableName}, value)
    End Sub

    ''' <summary>
    ''' Hàm lưu một bản ghi vào database
    ''' </summary>
    ''' <param name="currentRow">Bản ghi cần lưu</param>
    ''' <returns>Trả lại đúng nếu thành công và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường modified on 18/06/2012</remarks>
    Public Function SaveData(ByVal currentRow As DataRow) As Boolean
        Dim result As Boolean
        If currentRow.RowState = DataRowState.Added Then
            result = db.ExecuteNonQuery(String.Format(My.Resources.InsertSP, currentRow.Table.TableName), currentRow.ItemArray) > 0
        ElseIf currentRow.RowState = DataRowState.Modified Then
            result = db.ExecuteNonQuery(String.Format(My.Resources.UpdateSP, currentRow.Table.TableName), currentRow.ItemArray) > 0
        End If
        Return result
    End Function

    ''' <summary>
    ''' Hàm xóa một bản ghi đã xác đinh trong database
    ''' </summary>
    ''' <param name="currentRow">Dòng cần xóa</param>
    ''' <returns>Trả lại đúng nếu thành công và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 10/04/2011</remarks>
    Public Function DeleteCurrentRow(ByVal currentRow As DataRow, ByVal deleteReason As String) As Boolean
        Return db.ExecuteNonQuery(String.Format(My.Resources.DeleteSP, currentRow.Table.TableName), currentRow(currentRow.Table.PrimaryKey(0)), deleteReason) > 0
    End Function

    ''' <summary>
    ''' Hàm xóa một bản ghi trong database theo một giá trị nhất định
    ''' </summary>
    ''' <param name="tableName">Tên của bảng muốn xóa dữ liệu</param>
    ''' <param name="columnName">Tên của cột để chọn lọc dữ liệu</param>
    ''' <param name="value">Giá trị cần xóa trong bảng</param>
    ''' <returns>Trả lại đúng nếu thành công và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 10/04/2011</remarks>
    Public Function DeleteByValue(ByVal tableName As String, ByVal columnName As String, ByVal value As Object) As Boolean
        Return db.ExecuteNonQuery(String.Format(My.Resources.DeleteByValueSP, tableName, columnName), value) > 0
    End Function

    ''' <summary>
    ''' Hàm kiểm tra trùng lặp dữ liệu
    ''' </summary>
    ''' <param name="columnName">Tên của trường cần kiểm tra</param>
    ''' <param name="checkRow">Tên dòng dữ liệu cần kiểm tra</param>
    ''' <returns>Trả lại true nếu dữ liệu không lặp và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 10/04/2011</remarks>
    Public Function CheckAvailable(ByVal columnName As String, ByVal checkRow As DataRow) As Boolean
        Return IsNothing(db.ExecuteScalar(String.Format(My.Resources.CheckAvailableSP, columnName), checkRow.Item(checkRow.Table.PrimaryKey(0).ColumnName), checkRow.Item(columnName)))
    End Function

    ''' <summary>
    ''' Hàm kiểm tra role
    ''' </summary>
    ''' <param name="employeeID">ID của nhân viên</param>
    ''' <returns>Trả lại true nếu nhân viên có quyền quản trị và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 16/09/2014</remarks>
    Public Function CheckRole(ByVal employeeID As String) As Boolean
        Return db.ExecuteScalar(My.Resources.CheckRoleSP, employeeID)
    End Function

    ''' <summary>
    ''' Hàm thêm mới nhiều dữ liệu cho một bảng
    ''' </summary>
    ''' <param name="table">Bảng cần lưu dữ liệu</param>
    ''' <returns>Trả lại true nếu lưu thành công và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 10/04/2011</remarks>
    Public Function AddTable(ByVal table As DataTable) As Boolean
        Dim blnResult As Boolean = False
        Dim conn As IDbConnection = db.CreateConnection
        conn.Open()
        Dim trans As IDbTransaction = conn.BeginTransaction
        Try
            For Each row As DataRow In table.Rows
                db.ExecuteNonQuery(String.Format(My.Resources.InsertSP, table.TableName), row.ItemArray)
            Next
            trans.Commit()
            blnResult = True
        Catch ex As Exception
            trans.Rollback()
        End Try
        Return blnResult
    End Function

    ''' <summary>
    ''' Hàm sửa dữ liệu theo kiểu cha - con
    ''' </summary>
    ''' <param name="ds">Dataset chứa dữ liệu cần lưu</param>
    ''' <param name="masterRow">Dữ liệu master cần lưu (Row)</param>
    ''' <param name="detailTable">Dữ liệu detail cần lưu (Table)</param>
    ''' <returns>Trả lại true nếu lưu thành công và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 18/06/2012</remarks>
    Public Function SaveMasterDetail(ByVal ds As DataSet, ByVal masterRow As DataRow, ByVal detailTable As DataTable) As Boolean
        Dim blnResult As Boolean = False
        Dim conn As IDbConnection = db.CreateConnection
        conn.Open()
        Dim trans As IDbTransaction = conn.BeginTransaction
        Try
            If masterRow.RowState = DataRowState.Added Then
                db.ExecuteNonQuery(String.Format(My.Resources.InsertSP, masterRow.Table.TableName), masterRow.ItemArray)
            ElseIf masterRow.RowState = DataRowState.Modified Then
                db.ExecuteNonQuery(String.Format(My.Resources.UpdateSP, masterRow.Table.TableName), masterRow.ItemArray)
            End If
            For Each childRow As DataRow In detailTable.Rows
                If childRow.RowState = DataRowState.Added Then
                    db.ExecuteNonQuery(String.Format(My.Resources.InsertSP, detailTable.TableName), childRow.ItemArray)
                ElseIf childRow.RowState = DataRowState.Modified Then
                    db.ExecuteNonQuery(String.Format(My.Resources.UpdateSP, detailTable.TableName), childRow.ItemArray)
                ElseIf childRow.RowState = DataRowState.Deleted Then
                    db.ExecuteNonQuery(String.Format(My.Resources.DeleteByValueSP, detailTable.TableName, childRow.Table.PrimaryKey(0).ColumnName), childRow.Table.PrimaryKey(0))
                End If
            Next
            trans.Commit()
            ds.AcceptChanges()
            blnResult = True
        Catch ex As Exception
            trans.Rollback()
            blnResult = False
        End Try
        Return blnResult
    End Function

    ''' <summary>
    ''' Hàm lấy dữ liệu để hiển thị trên báo cáo
    ''' </summary>
    ''' <param name="ds">Dataset để chứa dữ liệu</param>
    ''' <param name="tableName">Tên bảng để chứa dữ liệu</param>
    ''' <remarks>Nguyễn Huy Thường added on 10/04/2011</remarks>
    Public Sub FillReport(ByVal ds As DataSet, ByVal tableName As String)
        db.LoadDataSet(String.Format(My.Resources.FillReportSP, tableName), ds, New String() {tableName})
    End Sub
#End Region
End Class
